#include "m0wig.h"
#include "ui_m0wig.h"


M0Wig::M0Wig(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::M0Wig)
{

    ui->setupUi(this);
    udpServer = new QUdpSocket(this);
    tcpClient = new QTcpSocket(this);

    delayTimer = new QTimer(this);
    delayTimer->setSingleShot(true); // 只触发一次,让设备端tcp服务器先运行
    connect(udpServer, SIGNAL(readyRead()),this, SLOT(readPendingDatagrams()));
    connect(delayTimer, &QTimer::timeout, this, &M0Wig::onDelayTimeout);
    ui->progressBar->setValue(0);

    // 初始化连接状态
    connectionAttempts = 0;
}

M0Wig::~M0Wig()
{
    delete ui;
}

void M0Wig::on_search_pushButton_clicked()
{
     ui->textBrowser->clear();
      ui->progressBar->setValue(0);
     ui->textBrowser->append("等待连接中");
     udpServer->writeDatagram("stm32",QHostAddress("192.168.50.255"), 8888);
    connectionAttempts = 0;
}
void M0Wig::TcpReadSlot()
{
    ui->textBrowser->clear();
    // 读取所有可用数据
    QByteArray frame = tcpClient->readAll();
    QString str = QString::fromLocal8Bit(frame);

    // 1. 显示原始数据（带分隔线，便于区分不同消息）
    ui->textBrowser->append("===== 原始数据 =====");
    ui->textBrowser->append(str);

    // 尝试解析JSON数据
    QJsonParseError parseError;
    QJsonDocument jsonDoc = QJsonDocument::fromJson(frame, &parseError);

    if (parseError.error == QJsonParseError::NoError) {

        // 解析成功，检查是否为有效JSON对象
        if (jsonDoc.isObject()) {
            QJsonObject jsonObj = jsonDoc.object();

            // 3. 显示解析结果（关键字段提取）
            ui->textBrowser->append("\n===== 解析结果 =====");

            // 检查并提取"type"字段
            if (jsonObj.contains("type") && jsonObj["type"].isDouble()) {
                int type = jsonObj["type"].toInt();
                ui->textBrowser->append(QString("type: %1").arg(type));

                // 根据type字段处理不同类型的消息
                if (type == 0) {
                    // 处理attrack的消息
                    if (jsonObj.contains("attrack") && jsonObj["attrack"].isString()) {
                        QString attrack = jsonObj["attrack"].toString();
                        ui->textBrowser->append(QString("状态: %1").arg(attrack));

                        // 根据attrack的值执行不同操作
                        if (attrack == "ok") {
                            ui->textBrowser->append("✓ 服务端准备就绪！");
                            JSONDecSend();
                        }
                    }
                    if (jsonObj.contains("mqtt_address") && jsonObj["mqtt_address"].isString()) {
                        QString mqtt_address = jsonObj["mqtt_address"].toString();
                        QString text = "mqtt_address: " + mqtt_address;
                        ui->textBrowser->append(text);
                    }
                    if (jsonObj.contains("mqtt_port") && jsonObj["mqtt_port"].isDouble()) {
                        int mqtt_port = jsonObj["mqtt_port"].toInt();
                        QString text = "mqtt_address: " + QString::number(mqtt_port);
                        ui->textBrowser->append(text);
                    }
                }
                else if (type == 1) {
                    // 处理attrack的消息
                    if (jsonObj.contains("data") && jsonObj["data"].isObject()) {
                        QJsonObject datajsonObj = jsonObj["data"].toObject();
                        if (datajsonObj.contains("updata") && datajsonObj["updata"].isString()) {
                            QString updata = datajsonObj["updata"].toString();

                        if (updata == "true") {
                            ui->textBrowser->append("文件传输准备");
                            QTcpSocket *fileClient = new QTcpSocket(this);
                            fileClient->connectToHost(QHostAddress(sender), 8810);

                            if (fileClient->waitForConnected(3000)) {
                                QFile file("C:/Users/22984/Desktop/gateway_app/dev.zip");
                                qint64 totalSize = file.size();

                                // 1. 先发送【大端序】的文件大小
                                qint64 totalSizeBigEndian = qToBigEndian(totalSize);
                                fileClient->write((char*)&totalSizeBigEndian, sizeof(totalSizeBigEndian));
                                fileClient->waitForBytesWritten();

                                // 2. 再发送文件内容
                                if (file.open(QIODevice::ReadOnly)) {
                                    QByteArray buffer;
                                    qint64 hasRead = 0;

                                    while (!file.atEnd()) {
                                        buffer = file.read(1024);
                                        qint64 writeRet = fileClient->write(buffer);
                                        fileClient->waitForBytesWritten();

                                        hasRead += writeRet;
                                        int per = hasRead * 100 / totalSize;
                                        ui->progressBar->setValue(per);
                                    }
                                    file.close();
                                    qDebug() << "文件发送完成";
                                } else {
                                    qDebug() << "无法打开本地文件";
                                }
                            } else {
                                qDebug() << "连接服务器失败";
                            }


                            }
                        }
                    }
                }
               else if(type == 2)
                {
                    if (jsonObj.contains("data") && jsonObj["data"].isObject()) {
                        QJsonObject datajsonObj = jsonObj["data"].toObject();
                        if (datajsonObj.contains("trans_success") && datajsonObj["trans_success"].isString()) {
                            QString trans_success = datajsonObj["trans_success"].toString();
                            if(trans_success=="true")
                            {
                                ui->textBrowser->append("传输完成");
                            }
                        }}
                }
                else if(type == 3)
                 {
                     if (jsonObj.contains("data") && jsonObj["data"].isObject()) {
                         QJsonObject datajsonObj = jsonObj["data"].toObject();
                         if (datajsonObj.contains("updata_success") && datajsonObj["updata_success"].isString()) {
                             QString trans_success = datajsonObj["updata_success"].toString();
                             if(trans_success=="true")
                             {
                                 ui->textBrowser->append("升级完成");
                             }
                         }}
                 }
            }
        }
    } else {
        // 解析失败，显示错误信息
        ui->textBrowser->append("\n===== 解析错误 =====");
        ui->textBrowser->append(QString("错误: %1").arg(parseError.errorString()));
        ui->textBrowser->append("提示: 这可能不是JSON格式数据");
    }

    // 添加空行，分隔不同的消息
    ui->textBrowser->append("\n");

}

void M0Wig::onDelayTimeout()
{
    connect(tcpClient, SIGNAL(readyRead()),
                         this, SLOT(TcpReadSlot()));
   tcpClient->connectToHost(QHostAddress(sender),8889);
    ui->textBrowser->append("tcp等待连接");
}
void M0Wig::readPendingDatagrams()
{
    while (udpServer->hasPendingDatagrams()) {
        datagram.resize(udpServer->pendingDatagramSize());
        udpServer->readDatagram(datagram.data(), datagram.size(),
                                &sender, &senderPort);
        // 安全的字符串比较
        if (QString::fromUtf8(datagram) == "yes") {

            // 更新UI显示连接成功信息
            ui->textBrowser->clear();
            ui->textBrowser->append("-----连接成功------");
            ui->textBrowser->append("发送方 IP: " +sender.toString());
            ui->textBrowser->append("发送方端口: " + QString::number(senderPort));
            //关闭udp
            udpServer->close();
            delayTimer->start(1000);
        }
    }
}




void M0Wig::periodicTask()
{

}
////设备搜索协议发送
void M0Wig::JSONDecSend()
{
    QJsonObject jsonSearch;//json格式
    //设备搜索json
    jsonSearch["type"] = 0;  // 字符串类型
    jsonSearch["request"] = "connect_info";
    QJsonDocument doc(jsonSearch);
    QByteArray jsonData = doc.toJson(QJsonDocument::Compact);  // 紧凑格式（无缩进）
    tcpClient->write(jsonData);  // 发送JSON字符串
    tcpClient->flush();          // 确保数据立即发送
}
//文件传输
void M0Wig::fileServe()
{


}
//发送升级问询
void M0Wig::on_pushButton_2_clicked()
{
    // 创建内层 data 对象
    QJsonObject dataObj;
    dataObj["version"] = "v1.0.1";
    dataObj["file_name"] = "update.zip";
    dataObj["file_len"] = 560000;
    dataObj["md5"] = "AABBCCDDEEFF";

    // 创建外层主对象
    QJsonObject mainObj;
    mainObj["type"] = 1;  // 升级问询包
    mainObj["data"] = dataObj;  // 嵌套 data 对象

    // 转换为JSON文档
    QJsonDocument doc(mainObj);

    // 转换为JSON字符串（紧凑格式或缩进格式）
    QByteArray jsonData = doc.toJson(QJsonDocument::Compact);  // 紧凑格式：{"type":1,"data":{"ver":"v1.0.1",...}}

    tcpClient->write(jsonData);  // 发送JSON字符串
    tcpClient->flush();          // 确保数据立即发送
}

